/*
    需求:
        创建两个ROS节点，服务器和客户端，
        客户端可以向服务器发送目标数据N（一个整型数据）
        服务器会计算1到N之间所有整数的和，这是一个循环累加的过程，返回给客户端，
        这是基于请求响应模式的，
        又已知服务器从接收到请求到产生响应是一个耗时操作，每累加一次耗时0.1s，
        为了良好的用户体验，需要服务器在计算过程中，
        每累加一次，就给客户端响应一次百分比格式的执行进度，使用action实现。

    流程:
        1.创建客户端
        2.客户端请求步骤：
            a.请求
            b.处理连续反馈结果
            c.处理最终执行结果
*/

#include "ros/ros.h"
#include "actionlib/client/simple_action_client.h"
#include "demo01_action/AddIntsAction.h"

//处理最终反馈结果回调函数
void done_cb(const actionlib::SimpleClientGoalState &state, const demo01_action::AddIntsResultConstPtr &result)
{
    if (state.state_ == state.SUCCEEDED)
    {
        ROS_INFO("执行成功，最后结果是:%d", result->result);
    }
    else
    {
        ROS_INFO("执行失败");
    }
}

//开始的请求回调，激活回调
void active_cb()
{
    ROS_INFO("建立连接成功!");
}

//连续反馈的回调
void feedback_cb(const demo01_action::AddIntsFeedbackConstPtr &feedback)
{
    ROS_INFO("处理进度%.2f", feedback->progress_bar);
}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    ros::init(argc, argv, "addints_client");
    ros::NodeHandle nh;
    //创建客户端对象
    actionlib::SimpleActionClient<demo01_action::AddIntsAction> client(nh, "addints");
    ROS_INFO("等待服务器启动.....");
    client.waitForServer(); //等待服务启动

    //处理请求和回调的过程:
    // a.建立连接; --回调函数
    // b.处理连续反馈；--回调函数
    // c.处理最终反馈; --回调函数
    // void sendGoal(
    //     const demo01_action::AddIntsGoal &goal,
    //     boost::function<void (const actionlib::SimpleClientGoalState &state, const demo01_action::AddIntsResultConstPtr &result)> done_cb,
    //     boost::function<void ()> active_cb,
    //     boost::function<void (const demo01_action::AddIntsFeedbackConstPtr &feedback)> feedback_cb)
    demo01_action::AddIntsGoal goal;
    goal.num = 100;
    client.sendGoal(goal, done_cb, active_cb, feedback_cb);
    ros::spin(); //有回调函数的地方还必须加上，不然直接退出程序了。这个怎么解决。
    return 0;
}
